#ifndef __BUTTON_H__
#define __BUTTON_H__

#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "esp_err.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef enum {
    BUTTON_EVENT_PRESSED,          // 按键按下
    BUTTON_EVENT_RELEASED,         // 按键释放
    BUTTON_EVENT_SINGLE_CLICK,     // 短按
    BUTTON_EVENT_LONG_PRESSED      // 长按
} button_event_t;

typedef struct {
    gpio_num_t gpio_num;           // GPIO编号
    uint32_t debounce_time_ms;     // 消抖时间（毫秒）
    uint32_t long_press_time_ms;   // 长按时间阈值（毫秒）
    bool active_low;               // 是否低电平有效
    bool pull_up_en;               // 启用上拉电阻
    bool pull_down_en;             // 启用下拉电阻
    bool repeat_long_press;        // 是否启用长按重复触发
    uint32_t repeat_interval_ms;   // 重复触发间隔（毫秒）
} button_config_t;

typedef void (*button_event_cb_t)(button_event_t event, uint32_t press_duration_ms, void* arg); // 事件回调函数类型

typedef void* button_handle_t;     // 按键句柄

/**
 * @brief 初始化按键并返回句柄
 * 
 * @param config 按键配置
 * @return button_handle_t 按键句柄，失败返回NULL
 */
button_handle_t button_init(const button_config_t* config);

/**
 * @brief 注册事件回调函数
 * 确保用户回调函数快速执行，避免影响其他按钮检测
 * @param handle 按键句柄
 * @param cb 回调函数
 * @param arg 回调参数
 */
void button_register_cb(button_handle_t handle, button_event_cb_t cb, void* arg);

/**
 * @brief 反初始化按键
 * 
 * @param handle 按键句柄
 */
void button_deinit(button_handle_t handle);

/**
 * @brief 按键系统初始化
 * 
 * @return 0成功，其他失败
 */
int button_system_init(void);

/**
 * @brief 按键系统反初始化
 * 
 * @return 0成功，其他失败
 */
int button_system_deinit(void);

#ifdef __cplusplus
}
#endif

#endif // __BUTTON_H__
